<?php
 function glang_smarty($params) {

 	if(isset($params['s']))
 		$m = array($params['m'], $params['s']);
 	else
 		$m = &$params['m'];
 	
 	return glang($m, isset($params['t'])?$params['t']:(isset($params['text'])?$params['text']:'!!!'));
 }
 
 function glang($module, $text) { return __driver_lang::get($module, $text); }
 function elang($module, $text) { echo glang($module, $text); }
 
 class __driver_lang {
 	
    private static $langs = array();
    private $useCash = false;

    /**
     * Возвращает перевод слова по словарю с использованием пространства имен (namespace)
     * 
     * @ $module Название модуля
     *      Основной модуль (__module_MN) - string
     *      Подмодулть (__module_MN_sub) - array('MN', 'sub')
     *
     * @ $text текст для перевода
     *      Если пространство имен не используется ($lang['module']['text']='translate'), тип string с названием модуля
     *      Если неймспейсы используются ($lang['module']['namespace']['text']='translate') то тип array('namespace', 'text')
     *
     */
    static function get($module, $text) {

        self::reqLang($module);
          
        if(is_array($module)) $module = implode('.', $module);
        if(!is_array(self::$langs[$module])) {
            if(is_array($text)) $text = implode(' ', $text);
            return $text;
        }
        
        if(is_array($text)) {
            $return = self::$langs[$module];
            foreach($text as $item)
                $return = $return[$item];
            
            if(isset($return)) return $return;
            else return "$module-".implode(',', $text);
        } else {
            if(isset(self::$langs[$module][$text])) return self::$langs[$module][$text];
            else return $text;
        }
    }

    static function reqLang($module, $lang_type = null) {
        if($lang_type === NULL) $lang_type = DEFAULT_LANGUAGE;

        if(is_array($module)) { $key = implode('.', $module); $file = $module[1]; $module = $module[0]; }
        else { $key = &$module; $file = "default"; }
        
        if(is_array(self::$langs[$key])) return;
        
        if(is_file("./modules/{$module}/languages/{$lang_type}/{$file}.php")) {
            require_once("./modules/{$module}/languages/{$lang_type}/{$file}.php");
		} elseif(is_file("./modules/{$module}/languages/".DEFAULT_LANGUAGE."/{$file}.php")) {
			require_once("./modules/{$module}/languages/".DEFAULT_LANGUAGE."/{$file}.php");
		} else return false;
		
		    if(!is_array($lang) &&  is_array($languages)) { $lang = &$languages; }
		elseif( is_array($lang) &&  is_array($languages)) { $lang = array_merge_recursive($lang, $languges); unset($languages);}
		elseif(!is_array($lang) && !is_array($languages)) { return; } # Значит этот языковый файл уже был подключен, добавлять его не нужно!
		
		if(!is_array(self::$langs[$key])) self::$langs[$key] = array();
		
		self::$langs[$key] = array_merge_recursive(self::$langs[$key], $lang[$key]);

    }
        
    
    // Hold an instance of the class
    private static $instance;
    
    // A private constructor; prevents direct creation of object
    private function __construct($useCash) 
    {
        $this->useCash = $useCash;
    }

    // The singleton method
    public static function si($useCash = false) 
    {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c($userCash);
        }

        return self::$instance;
    }

    // Prevent users to clone the instance
    public function __clone()
    {
        trigger_error('Clone is not allowed.', E_USER_ERROR);
    }
 
 }
